package com.yf.stack.localvariables;

import java.util.Date;

public class LocalVariablesTest {
    private int count = 0;

    public static void main(String[] args) {
        LocalVariablesTest test = new LocalVariablesTest();
        int num= 10;
        test.m1();
    }

    public LocalVariablesTest() {
        // 构造方法和实例方法的局部变量表的index为0的slot处，保存了类实例对象的引用this
        // 其余的参数按照参数表顺序继续排列
    }

    private void m1() {
        Date date = new Date();
        String name = "yf.com";
        String m2r = m2(date, name);
        System.out.println(date + name);
    }

    private String m2(Date date2, String name2) {
        date2 = null; // 引用类型占用1个slot
        name2 = "yf"; // 引用类型占用1个slot
        double weight = 130.5; // double类型占用2个slot
        char gender = '男'; // char类型占用1个slot

        return date2 + name2;
    }

    /*
    测试局部变量表中的槽位是可以重用的，如果一个局部变量过了其作用域，
    那么在其作用域之后声明的局部变量就很有可能会复用过期局部变量的slot,从而达到节省资源的目的。
     */
    private void testReuseSlot() {
        int a = 1;
        {
            int b = 0;
            b = a + 1;
        }
        // 此时c就会复用b的slot
        int c = a + 2;
    }

    /*
    成员变量：在使用前都经历过默认赋值和初始化赋值
        类变量：linking的prepare阶段给类变量默认赋值，initial阶段进行显式赋值及静态代码块赋值（如果有）
        实例变量：随着对象的创建，会在堆空间中分配实例变量空间，并进行默认赋值
    局部变量：在使用前必须要显式赋值，否则编译不通过。
     */
    public void testLocalVariable() {
        int n;
//        System.out.println(n); // variable 'n' might not have been initialized
    }
}
